2014年 10月 31日
实验三 约瑟夫环和集合的相关运算的设计和实现
一.实验目的
利用线性表实现约瑟夫环和集合的判等、交、并和差等的运算,学会在实际问题下灵活运用它们。
1.利用线性表实现约瑟夫环的解答(即实验课本P178设计实验中的约瑟夫环问题)。
2.用有序单链表实现集合的判等、交、并和差的运算(即实验课本P180设计实验中的用单链表实现集合的操作)。
三.实验要求
1.建立实验模型,确定存储结构;对任意n个人,密码为m,实现约瑟夫环问题;出圈的顺序可以依次输出,也可以用一个数组实现。
2.对集合中的元素用有序单链表进行存储;实现交、并、差等基本运算时,不能另外申请存储空间;充分利用单链表的有序性,要求算法有较好的时间性能。
四.实验环境
PC微机
DOS操作系统或Windows操作系统
Turbo C程序集成环境或Visual C++程序集成环境
五.实验步骤及结果
1.建立一个空工程“约瑟夫环”,建立一个头文件“ysfring.”,如下:
#ifndef ysfring_H
#define ysfring_H
struct Node
{
int data;
Node*next;
};
class ysfring
{
public:
ysfring(int n);
~ysfring();
int Delete(Node*p);
void ysfh(int m);
private:
Node*ring;
};
#endif
2.在工程中新建一个源程序文件ysfring.cpp:
#include"ysfring.h"
#include<iostream>
using namespace std;
ysfring::ysfring(int n)
{
ring=new Node;
ring->data=1;
ring->next =ring;
Node*pre=ring;
for(int i=2;i<=n;i++)
{
Node*p=new Node;
p->data=i;
p->next =ring;
pre->next =p;
pre=p;
}
}
ysfring::~ysfring()
{
}
int ysfring::Delete (Node*p)
{
Node*q=p->next ;
int x=q->data ;
p->next=q->next;
delete q;
return x;
}
void ysfring::ysfh (int m)
{
Node*pre=ring;
Node*p=ring->next;
int count=2;
while(p!=pre)
{
if(count==m)
{
cout<<ysfring::Delete(pre)<<endl;
p=pre->next;
count=1;
}
else
{
pre=p;
p=p->next;
count++;
}
}
cout<<p->data<<endl;
delete p;
}
3.在工程中新建一个源程序文件ysfring-main.cpp:
#include<iostream>
#include"ysfring.h"
using namespace std;
void main()
{
int m,n;
cout<<"请输入m(不小于2)的值:";
cin>>m;
cout<<"请输入n(人数)的值:";
cin>>n;
ysfring ysfh(n);
ysfh.ysfh(m);
cin.get();
}
4.运行结果为:
六.实验小结